package com.lihaozhe.orderservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.web.client.RestClient;

/**
 * 订单服务应用启动类 - 负载均衡版本
 * 使用@LoadBalanced注解启用负载均衡功能
 * 订单服务是服务消费者，会调用用户服务和商品服务
 *
 * @author 李昊哲
 * @version 1.0.0
 */
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
  public static void main(String[] args) {
    SpringApplication.run(OrderServiceApplication.class, args);
  }

  /**
   * 创建普通的RestClient（用于直接URL调用）
   * 首选的默认RestClient（添加@Primary）
   *
   * @return 普通的RestClient实例
   */
  @Primary
  @Bean("restClient")
  public RestClient restClient() {
    return RestClient.builder().build();
  }

  /**
   * 创建普通的RestClient（用于直接URL调用）
   * 其他RestClient（非首选）指定名称
   *
   * @return 普通的RestClient实例
   */
  @Bean("normalRestClient")
  public RestClient normalRestClient() {
    return RestClient.builder().build();
  }

  /**
   * 创建负载均衡的RestClient
   * 使用@LoadBalanced注解后，RestClient会自动使用服务名进行服务发现和负载均衡
   * 这个方法本身不实现负载均衡逻辑，只是“启用”负载均衡功能。
   * 实际的负载均衡策略由另一个组件（即 ReactorLoadBalancer<ServiceInstance>）提供。
   * 它是客户端入口，用于发起带服务发现 + 负载均衡的请求。
   * 其他RestClient（非首选）指定名称
   *
   * @return 用于发起带服务发现 + 负载均衡请求的客户端入口
   */
  @Bean("loadBalancedRestClient")
  @LoadBalanced
  public RestClient loadBalancedRestClient() {
    return RestClient.builder().build();
  }

}
